package com.fy.common.vo;

import com.fy.common.enums.ApiErrorEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 数据结果返回的封装
 */
@Data
@NoArgsConstructor
@ApiModel(value="接口响应", description="接口响应")

//除了查询之外的操作，统一返回ApiRest
public class ApiRest<T>{


    /**
     * 成功默认消息
     */
    private static final Integer CODE_SUCCESS = 0;
    private static final String MSG_SUCCESS = "操作成功！";

    /**
     * 失败默认消息
     */
    private static final Integer CODE_FAILURE = 1;
    private static final String MSG_FAILURE = "请求失败！";

    /**
     * 响应消息
     */
    @ApiModelProperty(value = "响应消息")
    private String msg;
    /**
     * 响应代码
     */
    @ApiModelProperty(value = "响应代码,0为成功,1为失败", required = true)
    private Integer code;

    /**
     * 请求或响应body
     */
    @ApiModelProperty(value = "响应内容")
    protected T data;



    /**
     * 完成消息构造
     * @param code
     * @param message
     * @param data
     * @param <T>
     * @return
     */
    public static   <T> ApiRest<T> message(Integer code, String message, T data){
        ApiRest<T> response = new ApiRest<>();
        response.setCode(code);
        response.setMsg(message);
        if(data!=null) {
            response.setData(data);
        }
        return response;
    }


    /**
     * 请求成功空数据
     * @param <T>
     * @return
     */
    public static  <T> ApiRest<T> success(){
        return message(CODE_SUCCESS, MSG_SUCCESS, null);
    }



    /**
     * 请求成功，通用代码
     * @param message
     * @param data
     * @param <T>
     * @return
     */
    public static  <T> ApiRest<T> success(String message, T data){
        return message(CODE_SUCCESS, message, data);
    }


    /**
     * 请求成功，仅内容
     * @param data
     * @param <T>
     * @return
     */
    public static  <T> ApiRest<T> success(T data){
        return message(CODE_SUCCESS, MSG_SUCCESS, data);
    }


    /**
     * 请求失败
     * @param <T>
     * @return
     */
    public static  <T> ApiRest<T> failure(){
        return message(CODE_FAILURE, MSG_FAILURE, null);
    }


    /**
     * 请求失败，消息和内容
     * @param message
     * @param data
     * @param <T>
     * @return
     */
    public static  <T> ApiRest<T> failure(String message, T data){
        return message(CODE_FAILURE, message, data);
    }



    /**
     * 请求失败，仅内容
     * @param data
     * @param <T>
     * @return
     */
    public static  <T> ApiRest<T> failure(T data){
        return message(CODE_FAILURE, MSG_FAILURE, data);
    }






    /**
     * 请求失败，仅内容
     * @param <T>
     * @return
     */
    public static  <T> ApiRest<T> failure(ApiErrorEnum apiErrorEnum, T data){
        return message(apiErrorEnum.getCode(), apiErrorEnum.getMsg(), data);
    }


    /**
     * 是否成功
     * @return
     */
    public boolean isSuccess(){
        return code.equals(0);
    }


   
}